package com.java.base.exercise.guava;

import org.junit.Test;

import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;

/**
 * @Author RenPu
 * @Date 2021/7/3 10:33
 * @Version 1.0
 * @Description: java8--的optional的用法
 **/
public class OptionalTest {

    @Test
    public void test() throws Throwable {

        /**
         * 三张创建Optional的方法
         */

        //常见空的Optional的对象
        Optional.empty();

        //使用非空null值创建Optional
        Optional.of(1);
//
        //使用任意值创建Optional
        Optional optional = Optional.ofNullable(null);

        //判断引用是否缺失
        optional.isPresent();

        //当引用缺失时，不执行，不缺失执行
        optional.ifPresent(System.out::println);


        /**
         * 当引用缺失课执行的三种方法
         */

        optional.orElse("引用缺失！！！！");


        optional.orElseGet(() -> {
            return "自定义引用缺失";
        });

        //抛出异常的方法
        optional.orElseThrow(() -> {
            throw new RuntimeException("引用缺失异常！！！");
        });

    }


    /**
     * 模拟传递null引用，测试stream出现的问题，使用Optional来避免这种问题
     *
     * @param list
     */
    public static void stream(List<String> list) {

        //案例版本
        // list.stream().forEach(System.out::println);


        //解决方案
        Optional.ofNullable(list)
                .map(List::stream)
                .orElseGet(Stream::empty)
                .forEach(System.out::println);

    }

    public static void main(String[] args) {
        stream(Arrays.asList("1", "2", "3"));
    }


}
